/*
 * Copyright 2007 National Bioinformatics Network
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package dgbgui.tools;

import java.util.LinkedHashSet;

import dgbgui.command.AddQueryCommand;
import dgbgui.command.CommandStack;
import dgbgui.command.DeleteQueryCommand;
import dgbgui.command.GroupCommand;
import dgbgui.modeldocument.Query;
import dgbgui.modeldocument.definition.BooleanDefinition;
import dgbgui.modeldocument.definition.Definition;
import dgbgui.selection.SelectionManager;

public abstract class CreateBooleanTool implements Tool {
    
    public void execute() {
        
        // Get the nodes to boolean
        LinkedHashSet<Object> selectedObjs = SelectionManager.getInstance().getSelection(Query.class);
        
        LinkedHashSet<Query> selectedNodes = new LinkedHashSet<Query>();
        for ( Object obj : selectedObjs ) {
            selectedNodes.add((Query)obj);
        }
        
        // The command group for removing and adding nodes
        GroupCommand groupCommand = new GroupCommand();
        // Remove the two child nodes from the model canvas
        for ( Query node : selectedNodes ) {
            groupCommand.add(new DeleteQueryCommand(node));
        }
        
        // Add the new intersection node
        Definition newDef = createNewdefinition(selectedNodes);
        groupCommand.add(new AddQueryCommand(new Query(newDef)));
        CommandStack.getInstance().execute(groupCommand);

    }

    abstract BooleanDefinition createNewdefinition(LinkedHashSet<Query> children);
    
    

}
